# Лекция: Cucumber в Java

Cucumber - это инструмент для тестирования, который поддерживает Behavior Driven Development (BDD). Он позволяет описывать поведение программы на понятном для людей языке, который затем преобразуется в автоматизированные тесты.

## Добавление Cucumber в проект

Чтобы использовать Cucumber, нужно добавить его в зависимости проекта.

```xml
<dependencies>
    <dependency>
        <groupId>io.cucumber</groupId>
        <artifactId>cucumber-java</artifactId>
        <version>6.10.4</version>
        <scope>test</scope>
    </dependency>
</dependencies>
```

## Написание сценариев

Сценарии в Cucumber описываются на языке Gherkin. Каждый сценарий состоит из шагов, которые описывают поведение программы.

```gherkin
Feature: Calculator
  Scenario: Addition
    Given I have a calculator
    When I add 2 and 3
    Then I should get 5
```

## Написание шагов

Шаги в Cucumber описываются с помощью аннотаций `@Given`, `@When` и `@Then`.

```java
import io.cucumber.java.en.*;

public class CalculatorSteps {
    private Calculator calculator;
    private int result;

    @Given("I have a calculator")
    public void i_have_a_calculator() {
        calculator = new Calculator();
    }

    @When("I add {int} and {int}")
    public void i_add_and(int a, int b) {
        result = calculator.add(a, b);
    }

    @Then("I should get {int}")
    public void i_should_get(int expected) {
        assertEquals(expected, result);
    }
}
```

## Запуск тестов

Тесты можно запустить из IDE или с помощью Maven командой `mvn test`.

---

# Практические задания

1. **Напишите сценарий для проверки сложения двух чисел и реализуйте соответствующие шаги.** (Сложность: 2/5)
```gherkin
Feature: Calculator
  Scenario: Addition
    Given I have a calculator
    When I add 2 and 3
    Then I should get 5
```
```java
@Given("I have a calculator")
public void i_have_a_calculator() {
    calculator = new Calculator();
}

@When("I add {int} and {int}")
public void i_add_and(int a, int b) {
    result = calculator.add(a, b);
}

@Then("I should get {int}")
public void i_should_get(int expected) {
    assertEquals(expected, result);
}
```

2. **Напишите сценарий для проверки вычитания двух чисел и реализуйте соответствующие шаги.** (Сложность: 2/5)
```gherkin
Feature: Calculator
  Scenario: Subtraction
    Given I have a calculator
    When I subtract 3 from 5
    Then I should get 2
```
```java
@Given("I have a calculator")
public void i_have_a_calculator() {
    calculator = new Calculator();
}

@When("I subtract {int} from {int}")
public void i_subtract_from(int a, int b) {
    result = calculator.subtract(b, a);
}

@Then("I should get {int}")
public void i_should_get(int expected) {
    assertEquals(expected, result);
}
```

3. **Напишите сценарий для проверки деления на ноль и реализуйте соответствующие шаги. Ожидается исключение `ArithmeticException`.** (Сложность: 3/5)
```gherkin
Feature: Calculator
  Scenario: Division by zero
    Given I have a calculator
    When I divide 5 by 0
    Then I should get an error
```
```java
@Given("I have a calculator")
public void i_have_a_calculator() {
    calculator = new Calculator();
}

@When("I divide {int} by {int}")
public void i_divide_by(int a, int b) {
    try {
        result = calculator.divide(a, b);
        fail("Expected an ArithmeticException to be thrown");
    } catch (ArithmeticException e) {
        exception = e;
    }
}

@Then("I should get an error")
public void i_should_get_an_error() {
    assertNotNull(exception);
    assertEquals("/ by zero", exception.getMessage());
}
```

4. **Напишите сценарий для проверки метода `equals` класса `String` и реализуйте соответствующие шаги.** (Сложность: 3/5)
```gherkin
Feature: String
  Scenario: Equals
    Given I have two strings "abc" and "def"
    When I compare them
    Then They should not be equal
```
```java
private String string1, string2;
private boolean equal;

@Given("I have two strings {string} and {string}")
public void i_have_two_strings_and(String string1, String string2) {
    this.string1 = string1;
    this.string2 = string2;
}

@When("I compare them")
public void i_compare_them() {
    equal = string1.equals(string2);
}

@Then("They should not be equal")
public void they_should_not_be_equal() {
    assertFalse(equal);
}
```

5. **Создайте класс `Calculator` с методами `add`, `subtract`, `multiply` и `divide`. Напишите сценарии для этих методов и реализуйте соответствующие шаги.** (Сложность: 4/5)
```gherkin
Feature: Calculator
  Scenario: Addition
    Given I have a calculator
    When I add 2 and 3
    Then I should get 5

  Scenario: Subtraction
    Given I have a calculator
    When I subtract 3 from 5
    Then I should get 2

  Scenario: Multiplication
    Given I have a calculator
    When I multiply 2 and 3
    Then I should get 6

  Scenario: Division
    Given I have a calculator
    When I divide 6 by 3
    Then I should get 2.0
```
```java
private Calculator calculator;
private double result;

@Given("I have a calculator")
public void i_have_a_calculator() {
    calculator = new Calculator();
}

@When("I add {int} and {int}")
public void i_add_and(int a, int b) {
    result = calculator.add(a, b);
}

@When("I subtract {int} from {int}")
public void i_subtract_from(int a, int b) {
    result = calculator.subtract(b, a);
}

@When("I multiply {int} and {int}")
public void i_multiply_and(int a, int b) {
    result = calculator.multiply(a, b);
}

@When("I divide {int} by {int}")
public void i_divide_by(int a, int b) {
    result = calculator.divide(a, b);
}

@Then("I should get {double}")
public void i_should_get(double expected) {
    assertEquals(expected, result);
}
```